package com.easylinkin.linkappapi.lobar.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.easylinkin.linkappapi.common.model.RequestModel;
import com.easylinkin.linkappapi.lobar.dto.UserProjectDTO;
import com.easylinkin.linkappapi.lobar.dto.app.LobarUserDTO;
import com.easylinkin.linkappapi.lobar.dto.excel.ExcelResultDTO;
import com.easylinkin.linkappapi.lobar.dto.excel.ExcelResultDetailDTO;
import com.easylinkin.linkappapi.lobar.entity.Gate;
import com.easylinkin.linkappapi.lobar.entity.UserProject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.easylinkin.linkappapi.lobar.entity.emp.EmpUserBase;
import com.easylinkin.linkappapi.lobar.entity.emp.EmpUserBaseDTO;
import com.easylinkin.linkappapi.lobar.util.UnzipFileVo;
import com.easylinkin.linkappapi.lobar.vo.UserProjectVo;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.web.multipart.MultipartFile;
import site.morn.rest.RestMessage;

/**
 * <p>
 * 闸机表 服务类
 * </p>
 *
 * @author kanyuanfeng
 * @since 2022-04-13
 */
public interface UserProjectService extends IService<UserProject> {

  IPage<UserProjectDTO> queryListByPage(RequestModel<UserProjectDTO> requestModel);

  /**
   * 增加
   * @param userProject
   */
  void insert(UserProject userProject);

  /**
   * 根据id编辑
   * @param userProject
   */
  void updateOne(UserProject userProject);

  /**
   * @Description: 根据条件，获取统计
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   * @return
   */
  Map<String, Long> getCount(UserProjectDTO userProjectDTO);

  IPage<EmpUserBase> getBaseUsers(RequestModel<UserProjectDTO> requestModel);

  /**
   * @Description: 增加用户(同步emp)
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  void insertEmp(EmpUserBaseDTO empUserBaseDTO);

  EmpUserBase saveEmpBaseUser(EmpUserBaseDTO empUserBaseDTO);

  /**
   * @Description: 编辑用户(emp)
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  void updateByIdEmp(EmpUserBaseDTO empUserBaseDTO);

  /**
   * @Description: 根据id查询用户详情(基础属性)
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  EmpUserBaseDTO getByIdEmp(String id);

  /**
   * @Description: 根据id查询用户详情(基础属性)
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  EmpUserBaseDTO getByUserIdAndTenantIEmp(String userId,String tenantId);

  /**
   * @Description: 根据班组id查询，不分页
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  List<EmpUserBase> queryByGroupId(UserProjectDTO userProjectDTO);

  /**
   * @Description: 删除用户（包含批量删除）
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  void delBatch(Set<String> ids);

    void delGateBatch(Set<String> ids);

    /**
   * app通讯录（数据来源花名册）
   *
   * @param userProjectVo 项目花名册vo
   * @return 统一出参
   */
  RestMessage appAddressBook(UserProjectVo userProjectVo);

  /**
   * @Description: 下发到闸机
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  Map<String, Object> upToGate(String id);

  /**
   * 批量导入花名册
   * isReal true 实名制 反之非实名制
   */
  ExcelResultDTO importExcel(MultipartFile file,Integer type,String tenantId,Boolean isReal)
      throws Exception;

  /**
   * app获取总人数和出勤率
   */
  LobarUserDTO getSum(String tenantId);

  /**
   * 获取工种考勤率(3级工种)
   */
  Map<String, List<LobarUserDTO>> getBy3WorkType(String workType);

  /**
   * 获取工种考勤率(2级工种)
   */
  List<LobarUserDTO> getBy2WorkType(String workType);

  //下发到闸机
  Map<String, Object> userToGate(EmpUserBase empUserBase, Integer roleType);

  /**
   * 知道用户从闸机设备删除
   *
   * @param empUserBase 用户
   * @param code        设备编码
   * @param flag true需要抛异常
   */
  void delGate(EmpUserBase empUserBase, String code,Boolean flag);

  /**
   * 实时人员统计（出勤/在场）
   */
  List<LobarUserDTO> getOmNumByTid(String tenantId);

  /**
   * 下发到指定闸机
   * @param e
   * @param gate
   * @return
   */
  ExcelResultDetailDTO userToOneGate(EmpUserBase e, Gate gate);

  /**
   * 批量导入人员近照
   */
  ExcelResultDTO importPhoto(List<UnzipFileVo> unzipFileVos,String tenantId, Integer type) throws  Exception;

  /**
   * @Description: 根据条件，分页(不分页)查询非黑名单人员
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  IPage<UserProjectDTO> queryEnListByPage(RequestModel<UserProjectDTO> requestModel);

  /**
   * 查询最新的在岗人员
   * @param userId
   * @return
   */
  UserProject findNew(String userId);

  /**
   * @Description: 根据card查询是否存在base
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  EmpUserBase getByCard(String card);

  /**
   * @Description: 根据条件，分页(不分页)查询 黑名单使用
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  IPage<UserProjectDTO> queryBlackListByPage(RequestModel<UserProjectDTO> requestModel);

  /**
   * @Description: 根据条件，分页(不分页)查询人员在场情况
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  IPage<UserProjectDTO> onAreasList(RequestModel<UserProjectDTO> requestModel);

  /**
   * @Description: 在场人数统计
   * @author kan yuanfeng
   * @date 2020/11/04 11:42
   */
  Map<String, Integer> onAreaCount();

  void updateEduState(UserProject userProject);


  RestMessage queryProjectUserSelect();
}
